#include "list.h"


/*
* 函数功能：创建一个 List 并返回 
* return : 创建的 List
*/
DYMList DYMListCreateList()
{
    DYMList ret = {
        .buffer = NULL,
        .size = 0
    };
    //  在下面填写你的代码


    return ret;
}

/*
* 函数功能：在 list 头部添加一个元素
* @param list: 待操作链表
* @param elem: 待插入元素 
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0 
*/
int DYMListPushFront(DYMList *list, const DYMListDataType elem)
{
    int ret = 0;
    //  在下面填写你的代码


    return ret;
}

/*
* 函数功能：在 list 尾部添加一个元素
* @param list: 待操作链表
* @param elem: 待插入元素 
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListPushBack(DYMList *list, const DYMListDataType elem)
{ 
    int ret = 0;
    //  在下面填写你的代码

    
    return ret;
}

/*
* 函数功能：在 list 头部删除一个元素
* @param list: 待操作链表
* @param buffer: 若 buffer 不为 NULL,则被删除元素的值将被写入 buffer;
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListPopFront(DYMList *list, DYMListDataType *buffer)
{
    int ret = 0;
    //  在下面填写你的代码

    
    return ret;
}

/*
* 函数功能：在 list 尾部删除一个元素
* @param list: 待操作链表
* @param buffer: 若 buffer 不为 NULL,则被删除元素的值将被写入 buffer;
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListPopBack(DYMList *list, DYMListDataType *buffer)
{
    int ret = 0;
    //  在下面填写你的代码

    
    return ret;
}

/*
* 函数功能：从 list 中删除所有值为 elem 的元素, 并返回操作结果
* @param list: 待操作链表
* @param elem: 待删除元素
* @param equal: 比较两个 elem 是否相等的函数指针，该函数指针挂载的函数应当满足 1、a == b 返回 1；
                                                                          2、a != b 返回 0；
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListDelete(DYMList *list,const DYMListDataType elem, int (*equal)(DYMListDataType *a, DYMListDataType *b))
{
    int ret = 0;
    //  在下面填写你的代码

    
    return ret;
}

/*
* 函数功能：判断 list 中是否包含值为 elem 的元素，若包含返回 1， 否则返回 0。
* @param list: 待操作链表
* @param elem: 待查找的元素
* @param equal: 比较两个 elem 是否相等的函数指针，该函数指针挂载的函数应当满足 1、a == b 返回 1；
                                                                          2、a != b 返回 0；
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListContain(DYMList *list,const DYMListDataType elem, int (*equal)(DYMListDataType *a, DYMListDataType *b))
{
    int ret = 0;
    //  在下面填写你的代码

    
    return ret;
}

/*
* 函数功能：销毁一个链表 list
* @param list: 待操作链表
*/
void DYMListDestoty(DYMList *list)
{
    //  在下面填写你的代码


}


void DYMListForeach(DYMList *list, void (*visit)(DYMListDataType* data))
{
    if(!list) return;
    struct _list_node *tmp = list->buffer;
    
    for(int i = 0; i < list->size; ++i)
    {
        visit(&tmp->data);
        tmp = tmp->next;
    }
}
void DYMListReverseForeach(DYMList *list, void (*visit)(DYMListDataType* data))
{
    if(!list) return;
    struct _list_node *tmp = list->buffer->prev;
    
    for(int i = 0; i < list->size; ++i)
    {
        visit(&tmp->data);
        tmp = tmp->prev;
    }
}